package asem.tablaSimbolos.tipo;

import alex.Token;
import asem.TablaSimbolos;
import asem.excepciones.ExcepcionIncompatibilidadDeTipos;

public class TipoClase extends Tipo {
	private Token nombre;

	public TipoClase(Token token) {
		nombre = token;
	}

	public void compatibilidadDeTipos(Tipo t) {
		if (!(t instanceof TipoClase))
			throw new ExcepcionIncompatibilidadDeTipos(t.toString(),
					this.nombre.getLexema());
		else {
			String tipoRecibido = t.toString();
			boolean tiposCompatibles = this.nombre.getLexema().equals(
					tipoRecibido);
			TablaSimbolos tabla = TablaSimbolos.getInstance();
			while (!tiposCompatibles && !tipoRecibido.equals("Object")) {
				tipoRecibido = tabla.getClases().get(tipoRecibido)
						.getHeredaDe();
				tiposCompatibles = this.nombre.getLexema().equals(tipoRecibido);
			}
			if (!tiposCompatibles)
				throw new ExcepcionIncompatibilidadDeTipos(t.toString(),
						this.nombre.getLexema());
		}
	}

	public String toString() {
		return nombre.getLexema();
	}

	@Override
	public boolean compatible(Tipo t) {

		if (!(t instanceof TipoClase))
			return false;

		String tipoRecibido = t.toString();
		boolean tiposCompatibles = nombre.getLexema().equals(tipoRecibido);
		TablaSimbolos tabla = TablaSimbolos.tabla;

		while (!tiposCompatibles && !tipoRecibido.equals("Object")) {
			tipoRecibido = tabla.getClases().get(tipoRecibido).getHeredaDe();
			tiposCompatibles = nombre.getLexema().equals(tipoRecibido);
		}

		return tiposCompatibles;
	}
}
